package com.slt.android.tanxingscroller;

import android.animation.ValueAnimator;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;

/**
 * Created by dp on 2018/3/28.
 */

public class ClickTextView extends TextView {

    private static final String TAG = "ClickTextView";
    private Scroller mScroller;
    private VelocityTracker mVelocityTracker;


    public ClickTextView(Context context) {
        super(context);
        init();
    }

    public ClickTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ClickTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mScroller = new Scroller(getContext());
        mVelocityTracker = VelocityTracker.obtain();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                Log.d(TAG, "onTouchEvent: ActionDown");
//                mScroller.startScroll(getScrollX(), getScrollY(), 0, 400, 1000);
//                invalidate();
                break;
            }
            case MotionEvent.ACTION_MOVE: {

                break;
            }
            case MotionEvent.ACTION_UP: {
                Log.d(TAG, "onTouchEvent: ACTION_UP");
//                mScroller.startScroll(getScrollX(), getScrollY(), 0, -400, 1000);
//                invalidate();
                animateFun();
                break;
            }
            default:
                break;
        }
        return true;
    }

    private void animateFun() {
        final int startX = 0;
        final int deltaX = 100;
        ValueAnimator va = ValueAnimator.ofInt(0, 1).setDuration(1000);
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float fraction = animation.getAnimatedFraction();
                ((View) getParent()).scrollTo(startX + (int) (deltaX * fraction), 0);
                postInvalidate();
            }
        });
        va.start();
        View v;
        TextView tv;
        LinearLayout btn;
        RelativeLayout btn2;
        ViewGroup viewGroup;
    }

    /** mScroller本身并不能滑动，startScroll方法也不能滑动，这里面只是一些赋值操作
     *  在mScroller.startScroll之后的invalidate方法。会调用ondraw()方法。ondraw中会调用computeScroll方法。
     *  这时，mScroller.computeScrollOffset()方法会一点一点的不断的改变mScroller的currentX等值。类似于插值器。
     *  然后再到view中，进行scrollTo方法。从而改变位置。
     *  再postInvalidate。然后再执行ondraw。如此循环
     *
     *  类似于动画中插值器的思想
     *
     *  -----------------------------------------------------------------------------
     *  问：怎么实现弹性滑动?
     *  答: 这里可以通过mScroller来实现。
     *  1.通过scroller的startScroll方法设定初始值。
     *  2.然后调用invalidate方法触发view的ondraw方法
     *  3.ondraw方法触发重写的computeScroll方法
     *  4.在computeScroll方法中，调用computeScrollOffset。不断的改变mScroller中保存的CurrX等值，
     *  再不断的滑动CurrX这样一小段的位移。从而达到弹性滑动的效果
     *
     *  -----------------------------------------------------------------------------
     *  问：怎么实现弹性滑动?
     *  答: 通过动画，动画本身就是一种渐近的过程。因此通过动画来实现滑动，天然就具有弹性效果
     *
     * */

//    再使用动画效果时注释了这2个函数
//    @Override
//    public void computeScroll() {
//        if (mScroller.computeScrollOffset()) {
//            ((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
//            postInvalidate();
//        }
//    }
}
